use crate::rtsp::marshal_trait::{Marshal, Unmarshal};

// RtpMap 结构体，用于存储 RTP（Real - Time Transport Protocol）映射信息
#[derive(Debug, Clone, Default)]
pub struct RtpMap {
    // 负载类型
    pub payload_type: u16,
    // 编码名称
    pub encoding_name: String,
    // 时钟速率
    pub clock_rate: u32,
    // 编码参数
    pub encoding_param: String,
}

impl Unmarshal for RtpMap {
    fn unmarshal(raw_data: &str) -> Option<Self> {
        // 创建一个默认的 RtpMap 实例
        let mut rtpmap = RtpMap::default();

        // 按空格分割原始字符串，得到负载类型部分和编码相关信息部分
        let parts: Vec<&str> = raw_data.split(' ').collect();

        // 处理负载类型部分
        if let Some(part_0) = parts.first() {
            // 尝试将负载类型部分解析为 u16 类型
            if let Ok(payload_type) = part_0.parse::<u16>() {
                // 解析成功则赋值给 rtpmap 的 payload_type 字段
                rtpmap.payload_type = payload_type;
            }
        }

        // 处理编码相关信息部分
        if let Some(part_1) = parts.get(1) {
            // 按斜杠分割编码相关信息，得到编码名称、时钟速率和编码参数部分
            let parameters: Vec<&str> = part_1.split('/').collect();

            // 处理编码名称部分
            if let Some(para_0) = parameters.first() {
                // 将编码名称部分转换为 String 类型并赋值给 rtpmap 的 encoding_name 字段
                rtpmap.encoding_name = para_0.to_string();
            }

            // 处理时钟速率部分
            if let Some(para_1) = parameters.get(1) {
                // 尝试将时钟速率部分解析为 u32 类型
                if let Ok(clock_rate) = para_1.parse::<u32>() {
                    // 解析成功则赋值给 rtpmap 的 clock_rate 字段
                    rtpmap.clock_rate = clock_rate;
                }
            }

            // 处理编码参数部分
            if let Some(para_2) = parameters.get(2) {
                // 将编码参数部分转换为 String 类型并赋值给 rtpmap 的 encoding_param 字段
                rtpmap.encoding_param = para_2.to_string();
            }
        }

        // 返回解析后的 RtpMap 实例
        Some(rtpmap)
    }
}

impl Marshal for RtpMap {
    fn marshal(&self) -> String {
        // 先格式化基本信息：负载类型、编码名称和时钟速率
        let mut rtpmap = format!(
            "{} {}/{}",
            self.payload_type, self.encoding_name, self.clock_rate
        );
        // 如果编码参数不为空字符串，则将其添加到格式化字符串中
        if self.encoding_param != *"" {
            rtpmap = format!("{}/{}", rtpmap, self.encoding_param);
        }

        // 最后添加换行符
        format!("{rtpmap}\r\n")
    }
}
